package com.foo.designpattern.mediator;

import junit.framework.TestCase;

/**
 * com.foo.designpattern.mediator
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-06-02 16:50.
 *
 * @Description 测试类：中介者模式(Mediator)/调停者模式
 * 中介者模式：所谓中介者模式就是用一个中介对象来封装一系列的对象交互，中介者使各对象不需要显式地相互引用，
 * 从而使其耦合松散，而且可以独立地改变它们之间的交互。
 * <p/>
 * 中介者模式所涉及的角色如下：
 * 1、抽象中介者(Mediator)角色：定义了同事对象到中介者之间的接口，其中主要方法是一个(或多个)事件方法；
 * 2、具体中介者(ConcreteMediator)角色：实现了抽象中介者所声明的事件方法。具体中介者知晓所有的具体同事类，
 * 并负责具体的协调各同事对象的交互关系；
 * 3、抽象同事类(Colleague)角色：定义出中介者到同事对象的接口。同事对象只知道中介者而不知道其余的同事对象；
 * 4、具体同事类(ConcreteColleague)角色：所有的具体同事类均从抽象同事类继承而来。实现自己的业务，在需要与其他同事通信的时候，就与
 * 持有的中介者通信，中介者会负责与其他的同事交互。
 * <p/>
 * 在中介者模式中中介者对象处于核心地位，因为它定义了整个系统中所有具体同事类之间的关系。在整个系统中它主要承担两个方面的责任：
 * 1、在结构上起到中转作用：通过中介者对象对关系的封装，使得具体的同事类不再需要显式地引用其他对象，
 * 它只需要通过中介者就可以完成与其他同事类之间的通信；
 * 2、在行为上起到协作作用：中介者对同事类之间的关系进行封装，同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。
 * 在这个过程中同事类是不需要指明直接这该如何做，中介者可以根据自身的逻辑来进行协调，对同事的请求进一步处理，
 * 将同事成员之间的关系行为进行分离和封装。
 * <p/>
 * 中介者模式的优点：
 * 1、简化了对象之间的关系，将系统的各个对象之间的相互关系进行封装，将各个同事类解耦，是系统成为耦合系统；
 * 2、减少了子类的生成；
 * 3、可以减少各个同事类的设计和实现。
 * 中介者模式的缺点：
 * 1、由于中介者对象封装了系统中对象之间的相互关系，导致其变得非常复杂，使得系统的维护比较困难。
 */

public class MediatorTestCase extends TestCase {
    public void testMediator() {
        System.out.println("= = = = ↓↓↓中介者模式，测试开始↓↓↓ = = = =");
        // 一个房东、一个租户、一个中介
        ConcreteMediator mediator = new ConcreteMediator();

        /**
         * 根据其他例子中所见，此处代码略显繁琐，因为这里建立双向关联且暴漏在App中。
         * 修改时可以考虑不在Colleague角色类中传入Mediator引用，而是通过Mediator的addColleague()建立双向关联，
         * 不过这需要给Colleague增加一个setMediator()方法。
         */

        // 房东和租户只需要知道中介即可
        Landlord landlord = new Landlord("张三", mediator);
        Lessee lessee = new Lessee("李四", mediator);

        // 中介需要知道房东和租户
        mediator.setLandlord(landlord);
        mediator.setLessee(lessee);

        lessee.contact("听说你那里有三室的房屋出租？");
        landlord.contact("是的，请问你需要租住吗？");
        System.out.println("= = = = ↑↑↑中介者模式，测试结束↑↑↑ = = = =");
    }
}
